package social.server.main;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Random;

/**
 * Classe responsavel por representar os contratos de 
 * Emprestimo de itens entre usuarios amigos
 * 
 * @author Caio
 *
 */

public class RequestItem extends Request{
	private String nameOfProduct;
	private int days;
	private Date deadDate;
	private int codeRequest;
	private String requestId;
	private boolean inProgressRequestStatus = false;
	private boolean canceledRequest = false;
	private String itemId;
	
	public RequestItem(String requestingUser, String destinationUser, String nameOfProduct , String itemId, int days){
		super(requestingUser, destinationUser);
		this.itemId = itemId;
		this.nameOfProduct = nameOfProduct;
		this.days = days;
		Date date = new Date();
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, days);
		deadDate = calendar.getTime();
		this.codeRequest = generateCode();
		this.requestId = destinationUser + "/" + requestingUser + "/" + Integer.toString(codeRequest);
		
	}
	
	/**
	 * Retorna true caso a requisicao tenha sido cancelada ou false caso contrario
	 * @return
	 */
	
	public boolean getCanceledRequest() {
		return canceledRequest;
	}

	/**
	 * Altera o estado de cancelamento da requisicao
	 * @param canceledRequest
	 */

	public void setCanceledRequest(boolean canceledRequest) {
		this.canceledRequest = canceledRequest;
	}

	/**
	 * Retorna true se a requisicao esta em andamento, ou false caso contrario
	 * @return
	 */

	public boolean getinProgressRequestStatus() {
		return inProgressRequestStatus;
	}

	/**
	 * Altera o estado de progresso da requisicao
	 * @param statusRequest
	 */

	public void setinProgressRequestStatus(boolean statusRequest) {
		this.inProgressRequestStatus = statusRequest;
	}
	
	/**
	 * Retorna o nome do produto a qual a requisicao se refere
	 * @return
	 */
	
	public String getNameOfProduct() {
		return nameOfProduct;
	}
	
	/**
	 * Altera o nome do produto a qual a requisicao se refere
	 * @param nameOfProduct
	 */
	
	public void setNameOfProduct(String nameOfProduct) {
		this.nameOfProduct = nameOfProduct;
	}
	
	/**
	 * Retorna o codigodo item a qual a requisicao se refere
	 * @return
	 */
	
	public String getItemId(){
		return itemId;
	}
	
	private int generateCode(){
		int cont;
		int num;
		do{
			cont = 0;
			List<Integer> codeList = System.getInstance().getRequestCodeList();
			Random rand = new Random();
			num = rand.nextInt();
			if(num < 0) num *= -1;
			if(codeList.size() == 0){
				System.getInstance().addRequestCodeList(num);
			}else{
				for(int i = 0; i < codeList.size(); i++){
					if(codeList.get(i) == num){
						++cont;
						break;
					}
				}
		}
		
		}while(cont != 0);
		
		System.getInstance().addRequestCodeList(num);
		return num;
		
	}
	
	/**
	 * Retorna o codigo da requisicao ( Nao e o RequestId! )
	 */
	
	public int getRequestCode(){
		return codeRequest;
	}
	
	/**
	 * Rertorna o RequestID da requisicao
	 * @return String referente ao RequestID
	 */
	
	public String getRequestId(){
		return requestId;
	}
	
	/**
	 * Altera a data de devolucao do item
	 * @param dias que devem ser adicionados a data original
	 */
	
	public void setDeadDate(int days){
		Date date = new Date();
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, days);
		deadDate = calendar.getTime();
	}
	
	/**
	 * Retorna a data para devolucao do item
	 * @return Data referente ao termino do emprestimo
	 */
	
	public Date getDeadDate(){
		return deadDate;
	}
	
	/**
	 * Retorna o numero de dias que o item devera estar emprestado
	 * @return
	 */
	
	public int getDays(){
		return days;
	}
	
	/**
	 * Verifica se duas requisicoes de Item sao iguais
	 */
	
	@Override
	public boolean equals(Object object){
		if(!(object instanceof RequestItem)) return false;
		
		RequestItem request = (RequestItem) object;
		if(super.getRequestingUser().equals(request.getRequestingUser()) && super.getDestinationUser().equals(request.getDestinationUser()) 
				&& (getRequestCode() == request.getRequestCode())) return true;
		else return false;
	}
	
	/**
	 * Retorna os dados Da requisicao em forma de String
	 */
	
	@Override
	public String toString(){
		String out = null;
		if(inProgressRequestStatus && !canceledRequest){
			out = getDestinationUser() + "-" + getRequestingUser() + ":" + getNameOfProduct() + ":" + "Andamento";
		}else if(inProgressRequestStatus == false && canceledRequest == false){
			out = getDestinationUser() + "-" + getRequestingUser() + ":" + getNameOfProduct() + ":" + "Completado";
		}else{
			out = getDestinationUser() + "-" + getRequestingUser() + ":" + getNameOfProduct() + ":" + "Cancelado";
		}
		return out;
	}

}
